package com.gimi.cloud.bbp.common.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.*;

/**
 * JSON 常用工具类
 * @author shazhiwei
 * @date 2017-12-22
 * @author  1.0
 */
public class JsonUtil {
    /**
     * 将对象转换成json格式
     * @param ts
     * @return
     */
    public static String toJson(Object ts) {
        return JSON.toJSONString(ts);
    }

    /**
     * 将对象转换成json格式(日期处理成yyyy-MM-dd HH:mm:ss)
     * @param ts
     * @return
     */
    public static String toJSONStringWithDateFormatYYYYMMDDHHMMSS(Object ts) {
        return JSON.toJSONStringWithDateFormat(ts,JSON.DEFFAULT_DATE_FORMAT);
    }

    /**
     * 将json转换成bean对象
     * @param jsonStr 待转话的json串
     * @param clazz 转化对象
     * @return 转化结果，如果jsonStr为非json串，则返回null
     */
    public static <T> T jsonToBean(String jsonStr, Class<T> clazz) {
        if(!isJSON(jsonStr)){
            return null;
        }
        return JSON.parseObject(jsonStr,clazz);
    }

    /**
     * 把指定的json串转化为指定对象的集合
     * @param jsonStr 待转化的json串
     * @param clazz 对象类型
     * @param <T>
     * @return 转化结果<br/>注意：如果传入的json串不是jsonarray字符串，返回null
     */
    public static <T> List<T> jsonToList(String jsonStr,Class<T> clazz){
        if(!isJsonArray(jsonStr) || null == clazz){
            return null;
        }
        return JSONArray.parseArray(jsonStr,clazz);
    }

    /**
     * 将指定的json串转化为Map对象
     * @param jsonStr 待转化的JSON串
     * @return 转化结果，如果jsonStr 为非json串，则返回null
     */
    public static Map<String, Object> jsonToMapObject(String jsonStr){
        if(!isJSON(jsonStr)){
            return null;
        }
        return JSON.parseObject(jsonStr,Map.class);
    }
    /**
     *
     * 将json格式转换成map对象
     * @param jsonStr 待转换的json字符串
     * @return 如果jsonStr为非JSON字符串，则返回 null
     */
    public static Map<String,String> jsonToMap(String jsonStr) {
        if(!isJSON(jsonStr)){
            return null;
        }
        return JSON.parseObject(jsonStr,Map.class);
    }

    /**
     * 把json字符串转化为JSONObject
     * @param jsonStr 待转化的json字符串
     * @return 转化后的结果
     */
    public static JSONObject jsonToJSONObject(String jsonStr){
        if(!isJSON(jsonStr)){
            return null;
        }
        return JSONObject.parseObject(jsonStr);
    }

    /**
     * 把json字符串转化为JSONArray
     * @param jsonStr 待转化的json字符串
     * @return 转化结果
     */
    public static JSONArray jsonToJSONArray(String jsonStr){
        if(isJsonArray(jsonStr)){
            return  null;
        }
        return JSONArray.parseArray(jsonStr);
    }

    /**
     * map转成json字符串
     * @param params 待转化的map
     * @return 转化结果，如果map为空，则返回 "{}"
     */
    public static String buildJSON(Map<String, Object> params){
        if(null == params){
            return "{}";
        }
        return JSON.toJSONString(params);
    }

    /**
     * 判断指定字符串是否是json类型
     * @param jsonStr 待判断的json字符串
     * @return 判断结果
     */
    public static boolean isJSON(String jsonStr){
        try{
            if(null != jsonStr && !"".equals(jsonStr)){
                JSON.parse(jsonStr);
                return true;
            }
        }catch(Exception e){}
        return false;
    }

    /**
     * 判断指定json串是否是json结合
     * @param jsonStr 待判断的json串
     * @return 判断结果
     */
    public static boolean isJsonArray(String jsonStr){
        try{
            if(null != jsonStr && !"".equals(jsonStr)){
                JSONArray.parseArray(jsonStr);
                return true;
            }
        }catch(Exception e){}
        return false;
    }

    /**
     * 替换json串中的 \n,\t,\r,\r\n,以及空格
     * @param jsonstr 待替换的json串
     * @return 替换后的结果
     */
    public static  String replaceNow(String jsonstr){
        if(null== jsonstr){
            return null;
        }
        return jsonstr.replace("\n","")
                .replace("\t","")
                .replace("\r","")
                .replace("\r\n","")
                .replace(" ","");
    }
}
